# Описание

Функция создает таблицу с набором уникальных значений поля (допускается преобразование поля и агрегация)

Передаваемые параметры
- _fieldName - поле в модели (не в конкретной таблице)
- _tableName - имя таблицы-приемника уникальных значений поля _fieldName
- _destinationFieldName - имя поля-приемника уникальных значений поля _fieldName
- _transformOperator - содержит выражение для преобразования значения поля _fieldName. Агрегация поддерживается
- _returnVariableName - если в результате выборки будет 1 значение в таблице, то оно вернётся в эту переменную


## Синтаксис использования

Получить максимальное значение из поля **VALUE**, поместить его в поле **MaxValue** в таблицу **TEMP_Max_Value**
```
Call GetUniqueValues('VALUE', 'TEMP_Max_Value', 'MaxValue', 'Max(Num({expression}))');
```
![image](https://user-images.githubusercontent.com/8188055/207596502-6f3f64a9-3897-4aa5-882b-79445eae8e47.png)

Получить максимальное значение из поля **VALUE**, поместить его в поле **MinValue** в таблицу **TEMP_Min_Value** и записать значение в переменную **varMinValue**
```
Call GetUniqueValues('VALUE', 'TEMP_Min_Value', 'MinValue', 'Min(Num({expression}))','varMinValue');
```
![image](https://user-images.githubusercontent.com/8188055/207596544-e570a1cd-dd95-4909-9283-19954c11b0b4.png)

![image](https://user-images.githubusercontent.com/8188055/207596849-3dd8611f-a205-4c7d-9a67-53ead58bfb7b.png)


Получить округленные до 0.1 значения из поля **VALUE**, поместить его в поле **RoundValue** в таблицу **TEMP_Round_Value**

```
Call GetUniqueValues('VALUE', 'TEMP_Round_Value', 'RoundValue', 'ROUND({expression},0.1)');
```
![image](https://user-images.githubusercontent.com/8188055/207596611-4eff9add-5669-44b9-90b8-35c6eee687aa.png)


Получить список всех уникальных значений из поля **ID**, поместить его в поле **IdValue** в таблицу **TEMP_Id** и преобразовать в тип данных **$text** и **$ascii**
```
Call GetUniqueValues('ID', 'TEMP_Id', 'IdValue', 'TEXT');
```
![image](https://user-images.githubusercontent.com/8188055/207596720-7b10049b-8681-4609-918e-f17d32e09022.png)


## Тестовый набор данных
```
TABLE:
LOAD
    RECNO() AS ID
    , RAND() AS VALUE
AUTOGENERATE 100000;
```

# Функция

```
SUB GetUniqueValues(_fieldName, _tableName, _destinationFieldName, _transformOperator, _returnVariableName)
    SET eDefaultIfEmpty = 'IF (LEN($1), $1, $2)';
    LET lib_vTransformOperator = $(eDefaultIfEmpty(_transformOperator, ''));
    LET lib_vExpression = IF(INDEX(lib_vTransformOperator, '{expression}')
        , REPLACE(lib_vTransformOperator, '{expression}', 'FIELDVALUE(' & CHR(39) & '$(_fieldName)' & CHR(39) & ', RECNO())')
        , lib_vTransformOperator & '(FIELDVALUE(' & CHR(39) & '$(_fieldName)' & CHR(39) & ', RECNO()))');
    LET lib_vDistinctValuesQty = FIELDVALUECOUNT(_fieldName);
    NOCONCATENATE [$(_tableName)]:
    LOAD DISTINCT
        $(lib_vExpression) AS [$(_destinationFieldName)]
        AUTOGENERATE $(lib_vDistinctValuesQty);
    IF NOOFROWS('$(_tableName)') = 1 AND LEN('$(_returnVariableName)') THEN
        LET [$(_returnVariableName)] = PEEK('$(_destinationFieldName)');
    END IF;
    SET lib_vDistinctValuesQty=;
    SET lib_vTransformOperator=;
    SET lib_vExpression=;
    SET eDefaultIfEmpty=;
END SUB;
```


# Полный скрипт с тестовым набором данных

```

/*
Создает таблицу с набором уникальных значений поля (допускается преобразование поля и агрегация)

_fieldName - поле в модели (не в конкретной таблице)
_tableName - имя таблицы-приемника уникальных значений поля _fieldName
_destinationFieldName - имя поля-приемника уникальных значений поля _fieldName
_transformOperator - содержит выражение для преобразования значения поля _fieldName. Агрегация поддерживается
_returnVariableName - если в результате выборки будет 1 значение в таблице, то оно вернётся в эту переменную
*/
SUB GetUniqueValues(_fieldName, _tableName, _destinationFieldName, _transformOperator, _returnVariableName)
    SET eDefaultIfEmpty = 'IF (LEN($1), $1, $2)';
    LET lib_vTransformOperator = $(eDefaultIfEmpty(_transformOperator, ''));
    LET lib_vExpression = IF(INDEX(lib_vTransformOperator, '{expression}')
        , REPLACE(lib_vTransformOperator, '{expression}', 'FIELDVALUE(' & CHR(39) & '$(_fieldName)' & CHR(39) & ', RECNO())')
        , lib_vTransformOperator & '(FIELDVALUE(' & CHR(39) & '$(_fieldName)' & CHR(39) & ', RECNO()))');
    LET lib_vDistinctValuesQty = FIELDVALUECOUNT(_fieldName);
    NOCONCATENATE [$(_tableName)]:
    LOAD DISTINCT
        $(lib_vExpression) AS [$(_destinationFieldName)]
        AUTOGENERATE $(lib_vDistinctValuesQty);
    IF NOOFROWS('$(_tableName)') = 1 AND LEN('$(_returnVariableName)') THEN
        LET [$(_returnVariableName)] = PEEK('$(_destinationFieldName)');
    END IF;
    SET lib_vDistinctValuesQty=;
    SET lib_vTransformOperator=;
    SET lib_vExpression=;
    SET eDefaultIfEmpty=;
END SUB;

TABLE:
LOAD
    RECNO() AS ID
    , RAND() AS VALUE
AUTOGENERATE 100000;


Call GetUniqueValues('VALUE', 'TEMP_Max_Value', 'MaxValue', 'Max(Num({expression}))');
Call GetUniqueValues('VALUE', 'TEMP_Min_Value', 'MinValue', 'Min(Num({expression}))','varMinValue');
Call GetUniqueValues('VALUE', 'TEMP_Round_Value', 'RoundValue', 'ROUND({expression},0.1)');
Call GetUniqueValues('ID', 'TEMP_Id', 'IdValue', 'TEXT');

```
